#include "json.h"
#include "json_private.h"
#include <fstream>
#include <string>

void JSON_OBJ::load(const string &in, int start, int *rei)
{
    JSON_VAR temp;
    int size = in.size();
    for (int i = start; i < size; i++)
    {
        if (in[i] == RK) // 为了避免上色错误而使用宏
        {
            *rei = i + 1;
            return;
        }
        if (in[i] == '\"')
        {
            temp.name = getName(in, i + 1, &i);
            i++;
            temp.getVal(in, i, &i);
            var.push_back(temp);
        }
    }
    *rei = size - 1;
    return;
}

void JSON_OBJ::read(const string &path)
{
    string json = "";
    string temp;

    //* 对读入的数据进行预处理
    ifstream in(path);
    if (!in)
    {
        return;
    }
    while (!in.eof())
    {
        getline(in, temp);
        temp = rms(temp);
        json += temp;
    }
    in.close();

    int size = json.size();
    string ans = "";
    for (int i = 0; i < size; i++)
    {
        if (i < size - 1 && json.substr(i, 2) == "/*")
        {
            i += 2;
            while (i < size - 1 && json.substr(i, 2) != "*/")
            {
                i++;
            }
            i += 2;
        }
        ans+=json[i];
    }
    json = ans;

    int i = 0;
    load(json, 0, &i);
    // 调用函数进行加载
    return;
}

void JSON_OBJ::del()
{
    int size = var.size();
    for (int i = 0; i < size; i++)
    {
        var[i].del();
    }
}

JSON_OBJ::~JSON_OBJ()
{
}

string JSON_OBJ::display(int ts)
{
    string tab = "";
    for (int i = 0; i < ts; i++)
    {
        tab += "\t";
    }
    string ans = "{\n";

    int size = var.size();
    for (int i = 0; i < size; i++)
    {
        ans += var[i].display(ts + 1);
        if (i < size - 1)
        {
            ans += ",\n";
        }
    }
    ans += "\n" + tab + "}";
    return ans;
}

void JSON_OBJ::write(const string &path)
{
    ofstream out(path);
    out << display();
    out.close();
}

JSON_VAR JSON_OBJ::getVar(const string &name)
{
    int size = var.size();
    for (int i = 0; i < size; i++)
    {
        if (var[i].name == name)
        {
            return var[i];
        }
    }
    return JSON_VAR();
}
